package com.electromagnetic.industry.software.manage.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.electromagnetic.industry.software.common.resp.ElectromagneticResult;
import com.electromagnetic.industry.software.manage.pojo.models.EdFileInfo;
import com.electromagnetic.industry.software.manage.pojo.other.FileInfoVO;
import com.electromagnetic.industry.software.manage.pojo.req.CreateFolderDTO;
import com.electromagnetic.industry.software.manage.pojo.req.FileChunkDTO;
import com.electromagnetic.industry.software.manage.pojo.req.FileInfoQueryDTO;
import com.electromagnetic.industry.software.manage.pojo.req.UpdateFileInfoDTO;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.core.io.InputStreamResource;
import org.springframework.http.ResponseEntity;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;

public interface EdFileInfoService {

    /**
     * 查询文件列表
     *
     * @param fileInfoQueryDTO
     * @return
     */
    ElectromagneticResult<?> queryEdFileInfo(FileInfoQueryDTO fileInfoQueryDTO, int dataOwnCode);

    /**
     * 新建文件夹
     *
     * @return
     */
    ElectromagneticResult<?> createFolder(CreateFolderDTO createFolderDTO, int dataOwnCode);

    /**
     * 项目层级结构查询
     *
     * @return
     */
    ElectromagneticResult<?> tree(int querySource);

    /**
     * 删除目录
     *
     * @param id
     * @return
     */
    ElectromagneticResult<?> delete(String id, int dataOwnCode);

    /**
     * 下载文件
     *
     * @param id
     * @return
     */
    ResponseEntity<InputStreamResource> download(String id, HttpServletResponse response, int dataOwnCode);

    /**
     * 更新文件信息
     *
     * @param updateFileInfoDTO
     */
    ElectromagneticResult<?> updateFileInfo(UpdateFileInfoDTO updateFileInfoDTO, int dataOwnCode);

    /**
     * 版本回退
     *
     * @param fileId
     * @param targetVersion
     * @return
     */
    ElectromagneticResult<?> versionBack(String fileId, int targetVersion);

    /**
     * 查看分片是否存在
     *
     * @param fileChunkDTO
     * @return
     */
    ElectromagneticResult<?> checkChunkExist(FileChunkDTO fileChunkDTO, int dataOwnCode);

    /**
     * 批量导入
     *
     * @param fileChunkDTO
     * @return
     */
    ElectromagneticResult<?> batchImport(FileChunkDTO fileChunkDTO, int dataOwnCode);

    /**
     * 合并分片
     *
     * @param identifier
     * @param fileName
     * @param totalChunks
     * @return
     */
    ElectromagneticResult<?> mergeChunks(String identifier, String fileName, Integer totalChunks, int dataOwnCode);

    /**
     * 导出
     *
     * @param dataIdArr
     * @return
     */
    ResponseEntity<InputStreamResource> batchExport(String dataIdArr, HttpServletResponse response, int dataOwnCode) throws IOException;

    /**
     * 文件上传
     *
     * @param parentId
     * @param file
     * @param strategy
     * @return
     */
    ElectromagneticResult<?> upload(String parentId, MultipartFile file, Integer strategy, int dataOwnCode);

    /**
     * 版本查看
     *
     * @param fileId
     * @return
     */
    ElectromagneticResult<?> versionView(String fileId);

    /**
     * 移动文件
     *
     * @param id
     * @param targetFolderId
     * @return
     */
    ElectromagneticResult<?> moveFile(String id, String targetFolderId, Integer strategy, int dataOwnCode);

    /**
     * 复制文件
     *
     * @param id
     * @param targetFolderId
     * @return
     */
    ElectromagneticResult<?> copyFile(String id, String targetFolderId, Integer strategy, int dataOwnCode);

    /**
     * 发布管理
     *
     * @return
     */
    ElectromagneticResult<?> uploadRecord(int pageNum, int pageSize, int dataOwnCode);

    /**
     * 查询文件详情
     *
     * @param id
     * @return
     */
    ElectromagneticResult<?> detail(String id);

    /**
     * 获取文件的层级Id
     */
    String getCategoryId(String id);

    /**
     * 根据父id查询其下自定义的文件夹
     *
     * @param parentId
     * @return
     */

    ElectromagneticResult<?> queryChildFolder(String parentId, int dataOwnCode);

    /**
     * 文件预览
     *
     * @param id
     * @param response
     */
    ResponseEntity<InputStreamResource> preview(String id, HttpServletResponse response, int dataOwnCode);

    /**
     * 收藏页 数据查询
     *
     * @param page
     * @param ids
     * @param queryDTO
     * @return
     */
    IPage<FileInfoVO> queryFileList(Page<FileInfoVO> page, List<String> ids, FileInfoQueryDTO queryDTO, int saveStatus, int effectFlag);

    /**
     * 处理重名文件，文件名后+_1
     *
     * @param fileInfo
     */
    void resetFileInfoName(EdFileInfo fileInfo);

    /**
     * 添加收藏
     *
     * @param userId
     * @param fileId
     * @return
     */
    boolean addFavorite(String userId, String fileId);

    /**
     * 判断是否已收藏
     *
     * @param userId
     * @param fileId
     * @return
     */
    boolean isFavorite(String userId, String fileId);

    /**
     * 移除收藏
     *
     * @param userId
     * @param fileId
     * @return
     */
    boolean removeFavorite(String userId, String fileId);

    /**
     * 查询当前用户收藏文件信息
     *
     * @param userId           用户id
     * @param fileInfoQueryDTO 分页信息
     * @return
     */
    IPage<FileInfoVO> findFavorite(String userId, FileInfoQueryDTO fileInfoQueryDTO);

    /**
     * 文件上传并建立关系
     *
     * @param parentId
     * @param id       主文件Id
     * @param file
     * @param desc     关系描述
     * @return
     */
    ElectromagneticResult<?> uploadFileAndRelation(String parentId, String id, MultipartFile file, String desc, int dataOwnCode);

    boolean flushDataStatus(String id);
}
